package com.szrt.java.day20170113.demo02;


import java.lang.reflect.Method;

import org.junit.Test;

public class MethodTest02 {

	@Test
	public void callMethod() throws Exception {
		
		Class<?> clazz = Class.forName("com.szrt.java.day20170113.demo01.Student");
		System.out.println(clazz);
		
		//clazz 代表一份字节码（对象的图纸）  obj代表的是对象的实例  重点：凡是对象都是通过字节码造出来的。
		Object student = clazz.newInstance();
		//System.out.println(student);
		
		Method method = clazz.getDeclaredMethod("add",int.class,int.class);
		System.out.println(method);
		Object result = method.invoke(student, 1,2);
		System.out.println(result);
	}
	
	@Test
	public void callPrivateMethod() throws Exception {
		
		Class<?> clazz = Class.forName("com.szrt.java.day20170113.demo01.Student");
		System.out.println(clazz);
		
		//clazz 代表一份字节码（对象的图纸）  obj代表的是对象的实例  重点：凡是对象都是通过字节码造出来的。
		Object student = clazz.newInstance();
		//System.out.println(student);
		
		Method method = clazz.getDeclaredMethod("add",int.class,int.class);
		System.out.println(method);
		Object result = method.invoke(student, 1,2);
		System.out.println(result);
	}
	
	@Test
	public void doubleMethod() throws Exception{
		
		// 1 拿到类
		Class<?> clazz = Class.forName("com.szrt.java.day20170113.demo01.Student");
		//System.out.println(clazz);
		
		// 2 拿到类的对象
		Object student = clazz.newInstance();
		
		// 3 拿到指定的方法 并调用它 declared 申明 = 定义 只要有定义了这个方法就型，不管访问修饰符 pivate的方法可以拿到
		Method method = clazz.getDeclaredMethod("add", double.class,double.class);
		// 4 打开private方法的访问权限
		method.setAccessible(true);
		
		Object result = method.invoke(student, 1.23,3.456);
		System.out.println(result);
		
	}
	
}
